package com.heaven.constant;

import com.heaven.exception.RRException;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;

/**
 * 大文件存储在minio中为分块存储，需要时将分块传输给客户端，客户端将这些分块拼接起来就可以
 * 大文件分块临时存储格式：
 *  {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/blobs/{md5}--{1,2,3...}.suffix
 * 大文件上传完毕后就存储最后一个分块来标记大文件已经上传完毕, 大文件完整存储格式：:
 *  {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/{md5}.suffix
 * 标记文件格式: {COMMON_PREFIX}/exists/{md5}
 */

@Getter
public class BigFileConstant {
    @Value("${minio.bucket1}")
    public String bucketName;

    private static final String COMMON_PREFIX = "bigfile";

    private static final String LOCAL_STORE_PATH = "E:\\download";

    /**
     * 获取文件的扩展名
     * @param fileName 带后缀的文件名
     * @return 文件后缀名(.png, .mov...)
     */
    public static String getFileNameSuffix(String fileName){
        int index = fileName.lastIndexOf('.');
        if(index != -1){
            return fileName.substring(index);
        } else {
            //文件名不带扩展名
            throw new RRException("未携带规范文件名，需要携带扩展名");
        }
    }

    /**
     * 返回大文件的文件夹公共前缀
     * @param md5 文件MD5值
     * @return 文件分块的公共前缀 {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/
     */
    public static String bigFilePathPrefix(String md5) {
        return COMMON_PREFIX + "/" + md5.charAt(0) + "/" + md5.charAt(1) + "/" + md5 + "/";
    }

    /**
     * 返回大文件的文件夹前缀
     * @param md5 大文件MD5值
     * @return 文件分块的文件夹前缀 {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/blobs/
     */
    public static String getBlobPathPrefix(String md5){
        return bigFilePathPrefix(md5) + "blobs/";
    }

    /**
     * 获取分块文件的objectName
     * @param md5 大文件MD5值
     * @param index 分块索引
     * @param fileSuffix 文件后缀名
     * @return 文件分块的完整objectName {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/blobs/{md5}--{1,2,3...}.suffix
     */
    public static String getBlobObjectName(String md5, long index, String fileSuffix){
        return getBlobPathPrefix(md5) + md5 + "-" + index + fileSuffix;
    }

    /**
     * 获取大文件存储的objectName
     * @param md5 文件MD5值
     * @param fileSuffix 文件后缀名(.png, .mov...)
     * @return 文件完整存储的objectName {COMMON_PREFIX}/{md5第一位字符}/{md5第二位字符}/{md5}/{md5}.suffix
     */
    public static String getBigFileObjectName(String md5, String fileSuffix){
        return bigFilePathPrefix(md5) + md5 + fileSuffix;
    }

    /**
     * 获取大文件存在标记的objectName
     * @param md5 大文件MD5值
     * @return 大文件存在标记存储格式：{COMMON_PREFIX}/exists/{md5}
     */
    public static String getBigFileFlagObjectName(String md5){
        return  COMMON_PREFIX + "/" +"exists/" + md5;
    }

}
